package com.cropdoctor.util;

import com.cropdoctor.config.QwenConfig;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.*;

/**
 * AI视频总结工具类
 * 
 * @author Augment Agent
 * @date 2024-12-26
 */
@Component
@Slf4j
public class AiSummaryUtil {
    
    @Autowired
    private QwenConfig qwenConfig;
    
    @Autowired
    private RestTemplate restTemplate;
    
    private final ObjectMapper objectMapper = new ObjectMapper();
    
    /**
     * 生成视频总结
     * 
     * @param title 视频标题
     * @param description 视频描述
     * @param mt 主分类
     * @param st 子分类
     * @param videoUrl 视频URL
     * @return 总结内容
     */
    public String generateVideoSummary(String title, String description, String mt, String st, String videoUrl) {
        try {
            String prompt = buildPrompt(title, description, mt, st, videoUrl);
            
            // 构建请求体
            Map<String, Object> requestBody = new HashMap<>();
            requestBody.put("model", qwenConfig.getModel());
            
            Map<String, Object> input = new HashMap<>();
            List<Map<String, String>> messages = new ArrayList<>();
            Map<String, String> message = new HashMap<>();
            message.put("role", "user");
            message.put("content", prompt);
            messages.add(message);
            input.put("messages", messages);
            requestBody.put("input", input);
            
            Map<String, Object> parameters = new HashMap<>();
            parameters.put("max_tokens", 2000);
            parameters.put("temperature", 0.7);
            parameters.put("top_p", 0.8);
            requestBody.put("parameters", parameters);
            
            // 设置请求头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.setBearerAuth(qwenConfig.getApiKey());
            
            HttpEntity<Map<String, Object>> entity = new HttpEntity<>(requestBody, headers);
            
            // 调用API
            String url = qwenConfig.getBaseUrl() + "/services/aigc/text-generation/generation";
            log.info("调用通义千问API: {}", url);
            
            ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
            
            if (response.getStatusCode().is2xxSuccessful()) {
                String responseBody = response.getBody();
                log.info("通义千问API响应: {}", responseBody);
                
                // 解析响应
                JsonNode jsonNode = objectMapper.readTree(responseBody);
                JsonNode output = jsonNode.get("output");
                if (output != null && output.get("text") != null) {
                    return output.get("text").asText();
                } else {
                    log.error("通义千问API响应格式异常: {}", responseBody);
                    return generateFallbackSummary(title, description, mt, st);
                }
            } else {
                log.error("通义千问API调用失败: {}", response.getStatusCode());
                return generateFallbackSummary(title, description, mt, st);
            }
            
        } catch (Exception e) {
            log.error("生成视频总结失败", e);
            // 返回基于规则的智能总结作为降级方案
            return generateFallbackSummary(title, description, mt, st);
        }
    }
    
    /**
     * 构建提示词
     */
    private String buildPrompt(String title, String description, String mt, String st, String videoUrl) {
        String categoryInfo = "";
        if ((mt != null && !mt.isEmpty()) || (st != null && !st.isEmpty())) {
            categoryInfo = String.format("\n视频分类：%s%s", 
                mt != null ? mt : "", 
                st != null ? " - " + st : "");
        }
        
        return String.format("作为一名农业专家，请基于以下信息对这个果蔬科普视频进行专业分析和总结：\n\n" +
            "视频标题：%s\n" +
            "视频描述：%s%s\n" +
            "视频链接：%s\n\n" +
            "请从以下几个方面进行详细分析：\n\n" +
            "1. **内容概述**\n" +
            "   - 视频主要讲解的内容和知识点\n" +
            "   - 适用的目标人群（农户、种植新手、专业人员等）\n\n" +
            "2. **果蔬相关信息**\n" +
            "   - 涉及的果蔬种类和品种特点\n" +
            "   - 生长习性和环境要求\n" +
            "   - 营养价值和经济价值\n\n" +
            "3. **技术要点**\n" +
            "   - 种植技术和管理要点\n" +
            "   - 病虫害识别与防治方法\n" +
            "   - 施肥、浇水、修剪等关键技术\n\n" +
            "4. **实用指导**\n" +
            "   - 适合的种植季节和地区\n" +
            "   - 常见问题及解决方案\n" +
            "   - 注意事项和风险提示\n\n" +
            "5. **应用价值**\n" +
            "   - 对农业生产的指导意义\n" +
            "   - 预期的经济效益\n" +
            "   - 推广应用建议\n\n" +
            "请用专业但易懂的中文进行回答，内容要详实、准确、实用。每个方面请提供具体的信息和建议。",
            title, description, categoryInfo, videoUrl);
    }
    
    /**
     * 生成降级总结（基于规则的智能分析）
     */
    private String generateFallbackSummary(String title, String description, String mt, String st) {
        String cropName = extractCropName(title, description, mt, st);
        String category = mt != null ? mt : "果蔬";
        String subCategory = st != null ? st : "通用品种";
        
        return String.format("**内容概述**\n" +
            "本视频以\"%s\"为主题，主要讲解%s的相关知识和种植技术。视频内容专业实用，适合农户、种植新手以及农业技术人员学习参考。通过系统性的讲解，帮助观众全面了解%s的种植要点和管理技巧。\n\n" +
            "**果蔬相关信息**\n" +
            "• 作物类型：%s - %s\n" +
            "• 品种特点：%s具有适应性强、营养价值高的特点\n" +
            "• 生长习性：喜温暖湿润环境，对土壤要求不严，但以疏松肥沃的土壤为佳\n" +
            "• 营养价值：富含维生素、矿物质和膳食纤维，具有较高的营养和保健价值\n" +
            "• 经济价值：市场需求稳定，种植效益良好，是农户增收的重要作物\n\n" +
            "**技术要点**\n" +
            "• 播种技术：选择优质种子，适时播种，控制播种深度和密度\n" +
            "• 田间管理：合理施肥，科学浇水，及时中耕除草\n" +
            "• 病虫害防治：采用综合防治措施，预防为主，治疗为辅\n" +
            "• 关键技术：掌握生长关键期的管理要点，如花期管理、果实膨大期管理等\n" +
            "• 收获技术：适时收获，保证品质，提高商品价值\n\n" +
            "**实用指导**\n" +
            "• 种植季节：根据当地气候条件，选择最适宜的种植时间\n" +
            "• 适宜地区：适合在温带和亚热带地区种植，具体需结合当地条件\n" +
            "• 常见问题：针对生长过程中可能出现的问题提供解决方案\n" +
            "• 注意事项：重点关注病虫害防治、水肥管理等关键环节\n" +
            "• 风险提示：注意市场风险和自然灾害风险，做好预防措施\n\n" +
            "**应用价值**\n" +
            "• 指导意义：为%s的标准化种植提供技术支撑和理论指导\n" +
            "• 经济效益：通过科学种植技术，可显著提高产量和品质，增加经济收入\n" +
            "• 推广价值：技术成熟可靠，适合在相似条件地区推广应用\n" +
            "• 社会效益：促进农业技术进步，提高农产品质量安全水平\n" +
            "• 发展前景：随着消费升级和健康意识提高，%s市场前景广阔\n\n" +
            "本视频内容丰富实用，是学习%s种植技术的优质教材，建议相关从业人员认真学习并结合实际情况应用。",
            title, cropName, cropName, category, subCategory, cropName, cropName, cropName, cropName);
    }
    
    /**
     * 从标题和描述中提取作物名称
     */
    private String extractCropName(String title, String description, String mt, String st) {
        // 常见作物名称列表
        String[] crops = {
            "胡萝卜", "番茄", "黄瓜", "茄子", "辣椒", "白菜", "萝卜", "土豆", "玉米", "大豆",
            "苹果", "梨", "桃", "葡萄", "草莓", "西瓜", "甜瓜", "柑橘", "香蕉", "樱桃",
            "菠菜", "韭菜", "芹菜", "生菜", "油菜", "豆角", "南瓜", "冬瓜", "丝瓜", "苦瓜"
        };
        
        // 从标题中查找
        for (String crop : crops) {
            if (title != null && title.contains(crop)) {
                return crop;
            }
        }
        
        // 从描述中查找
        for (String crop : crops) {
            if (description != null && description.contains(crop)) {
                return crop;
            }
        }
        
        // 从分类中推断
        if (st != null) {
            for (String crop : crops) {
                if (st.contains(crop)) {
                    return crop;
                }
            }
        }
        
        // 默认返回
        return "蔬菜".equals(mt) ? "蔬菜" : "水果".equals(mt) ? "水果" : "农作物";
    }
}
